import { ref, onMounted } from 'vue';

function randomNum(min: number, max: number) {
  const num = Math.floor(Math.random() * (max - min) + min);
  return num;
}
function randomColor(min: number, max: number) {
  const r = randomNum(min, max);
  const g = randomNum(min, max);
  const b = randomNum(min, max);
  return `rgb(${r},${g},${b})`;
}

/**
 * 绘制图形验证码（支持预设码或随机生成）
 * @param width - 图形宽度（默认120）
 * @param height - 图形高度（默认40）
 * @param code - 预设验证码（可选）
 */
export const useImageVerify = (width = 120, height = 40, code?: string) => {
  const domRef = ref<HTMLCanvasElement>();
  const imgCode = ref(code || '');

  // 核心绘制函数改造
  function draw(dom: HTMLCanvasElement, customCode?: string) {
    const finalCode = customCode || generateRandomCode(4); // 默认生成4位随机码
    imgCode.value = finalCode;

    const ctx = dom.getContext('2d')!;
    ctx.fillStyle = randomColor(180, 230);
    ctx.fillRect(0, 0, width, height);

    // 动态计算字符间距
    const charSpacing = width / finalCode.length;
    for (let i = 0; i < finalCode.length; i++) {
      const fontSize = randomNum(18, 41);
      const deg = randomNum(-30, 30);
      ctx.font = `${fontSize}px Simhei`;
      ctx.textBaseline = 'top';
      ctx.fillStyle = randomColor(80, 150);
      ctx.save();
      ctx.translate(charSpacing * i + 15, 15);
      ctx.rotate((deg * Math.PI) / 180);
      ctx.fillText(finalCode[i], -15 + 5, -15);
      ctx.restore();
    }

    // 干扰线（保留原有逻辑）
    for (let i = 0; i < 5; i++) {
      ctx.beginPath();
      ctx.moveTo(randomNum(0, width), randomNum(0, height));
      ctx.lineTo(randomNum(0, width), randomNum(0, height));
      ctx.strokeStyle = randomColor(180, 230);
      ctx.closePath();
      ctx.stroke();
    }

    // 干扰点（保留原有逻辑）
    for (let i = 0; i < 41; i++) {
      ctx.beginPath();
      ctx.arc(randomNum(0, width), randomNum(0, height), 1, 0, 2 * Math.PI);
      ctx.closePath();
      ctx.fillStyle = randomColor(150, 200);
      ctx.fill();
    }
    return finalCode;
  }

  // 生成随机验证码
  function generateRandomCode(len: number) {
    const chars = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ'; // 扩展字符集[4](@ref)
    let code = '';
    for (let i = 0; i < len; i++) {
      code += chars[randomNum(0, chars.length)];
    }
    return code;
  }

  // 新增预设码支持
  function getImgCode(customCode?: string) {
    if (domRef.value) {
      imgCode.value = draw(domRef.value, customCode || code);
    }
  }

  // 初始化时自动填充预设码
  onMounted(() => {
    if (code) getImgCode(code);
  });

  return { domRef, imgCode, getImgCode };
};
